Amazon EKSでArgo CDの検証環境を作成したいときはEKS Blueprints for Terraformが便利

Amazon EKSでArgo CDの検証環境を作成したいときはEKS Blueprints for Terraformが便利

Clock Icon2024.07.11

Amazon EKS上にArgo CDの検証環境を作りたいときは、何を使っていますか?

最近環境を作る機会があって、EKS Blueprints for Terraformを使ったらとても楽だったので紹介します。

https://aws-ia.github.io/terraform-aws-eks-blueprints/

EKS BluePrints for Terraform

EKS BluePrints for TerraformはAmazon EKSのTerraformによる実装パターン集です。

概要は以下の記事がまとまっているので、ご確認ください。

https://dev.classmethod.jp/articles/terraform-eks-blueprints/

今回ご紹介するArgo CDの他にも、KarpenterやIstio等の様々な実装パターンが公開されています。

Amazon_EKS_Blueprints_for_Terraform

Argo CDのパターン

現在公開されているのは以下です。

マルチクラスターパターンも公開されている点が個人的には嬉しいポイントでした。

Amazon EKSでArgo CDを使う際は、Amazon EKSクラスターにArgo CDをインストールして利用するのですが、外部のAmazon EKSクラスターを登録することもできます。

外部クラスター登録の検証をする際には、最低2台k8sクラスターが必要になります。

マルチクラスターパターンのブループリントでは、Argo CDがインストールされるAmazon EKSクラスター(hub)とワークロード用のAmazon EKSクラスター(spoke prd/stg/devの3台)が作成されます。

Amazon EKSクラスターの数が増えるため手動でやると手間なんですが、このBlueprintsを使うことで簡単に構築できます。

Argo CDのマルチクラスターパターンをspoke1台構成でやってみる

手順を参考に実際にマルチクラスターパターンでやってみます。

https://aws-ia.github.io/terraform-aws-eks-blueprints/patterns/gitops-multi-cluster-hub-spoke-argocd/

手順通りにやると合計4台のAmazon EKSクラスターが作成されます。

gitops-bridge-multi-cluster-hup-spoke.drawio

コストが気になるので、spoke 1台構成でやってみます。

準備

手順の実行には以下のツールが必要です。インストールしておきます。

  • git
  • terraform
  • kubectl
  • argocd

リポジトリをクローンします。

git clone [email protected]:aws-ia/terraform-aws-eks-blueprints.git

https://github.com/aws-ia/terraform-aws-eks-blueprints

hub用のAmazon EKSクラスターをデプロイ

hub用(Argo CD)のAmazon EKSクラスターをデプロイします。

デフォルトでは、すべてのリソースがus-west-2に作成されます。

us-west-2を利用できない環境で実行する場合は、variables.tfregionのデフォルト値を書き換えるか*.tfvarsを用意して、上書きする等の対応をしてください。

cd terraform-aws-eks-blueprints/patterns/gitops/multi-cluster-hub-spoke-argocd/hub
# AWS認証情報をセット
export AWS_ACCESS_KEY_ID=<AWSアクセスキーID>
export AWS_SECRET_ACCESS_KEY=<AWSシークレットアクセスキー>
export AWS_SESSION_TOKEN=<AWSセッショントークン>
# Terraform実行
terraform init
terraform apply -target="module.vpc" -auto-approve
terraform apply -target="module.eks" -auto-approve
terraform apply -auto-approve

Applyが 完了すると、Amazon EKSクラスターが作成されていることを確認できます。(Apply完了までは10分程度かかります)

kubectlで作成したAmazon EKSクラスターを操作できるようにするためにkubconfigを更新します。

必要な情報はterraform outputで確認できます。

terraform output -raw configure_kubectl
# 出力結果をコンソールで実行する
export KUBECONFIG="/tmp/hup-spoke"
aws eks --region us-west-2 update-kubeconfig --name hub-control-plane --alias hub

Argo CD用のリソースがAmazon EKSクラスター上にデプロイされていることが確認できます。

kubectl --context hub get all -n argocd
出力例
NAME                                                            READY   STATUS    RESTARTS   AGE
pod/argo-cd-argocd-application-controller-0                     1/1     Running   0          2m26s
pod/argo-cd-argocd-applicationset-controller-579c649bb9-tcwwn   1/1     Running   0          2m27s
pod/argo-cd-argocd-dex-server-5896478fbf-jfkwh                  1/1     Running   0          2m27s
pod/argo-cd-argocd-notifications-controller-74fb7466f6-pjkl8    1/1     Running   0          2m26s
pod/argo-cd-argocd-redis-69dd89b5bd-h2fbk                       1/1     Running   0          2m27s
pod/argo-cd-argocd-repo-server-74cd459bc9-phdpg                 1/1     Running   0          2m27s
pod/argo-cd-argocd-server-6d9549674b-7dn7m                      1/1     Running   0          2m27s

NAME                                                       TYPE           CLUSTER-IP       EXTERNAL-IP                                                                  PORT(S)                      AGE
service/argo-cd-argocd-application-controller-metrics      ClusterIP      172.20.102.64    <none>                                                                       8082/TCP                     2m27s
service/argo-cd-argocd-applicationset-controller           ClusterIP      172.20.56.138    <none>                                                                       7000/TCP                     3m20s
service/argo-cd-argocd-applicationset-controller-metrics   ClusterIP      172.20.69.202    <none>                                                                       8080/TCP                     2m27s
service/argo-cd-argocd-dex-server                          ClusterIP      172.20.77.216    <none>                                                                       5556/TCP,5557/TCP            3m20s
service/argo-cd-argocd-redis                               ClusterIP      172.20.24.218    <none>                                                                       6379/TCP                     3m20s
service/argo-cd-argocd-repo-server                         ClusterIP      172.20.189.152   <none>                                                                       8081/TCP                     3m20s
service/argo-cd-argocd-repo-server-metrics                 ClusterIP      172.20.195.6     <none>                                                                       8084/TCP                     2m27s
service/argo-cd-argocd-server                              LoadBalancer   172.20.164.115   a434cafd70f7f41399839f825736b8ad-29127262.ap-northeast-1.elb.amazonaws.com   80:31111/TCP,443:31936/TCP   3m20s
service/argo-cd-argocd-server-metrics                      ClusterIP      172.20.167.246   <none>                                                                       8083/TCP                     2m27s

NAME                                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/argo-cd-argocd-applicationset-controller   1/1     1            1           3m20s
deployment.apps/argo-cd-argocd-dex-server                  1/1     1            1           3m20s
deployment.apps/argo-cd-argocd-notifications-controller    1/1     1            1           3m20s
deployment.apps/argo-cd-argocd-redis                       1/1     1            1           3m20s
deployment.apps/argo-cd-argocd-repo-server                 1/1     1            1           3m20s
deployment.apps/argo-cd-argocd-server                      1/1     1            1           3m20s

NAME                                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/argo-cd-argocd-applicationset-controller-579c649bb9   1         1         1       2m27s
replicaset.apps/argo-cd-argocd-applicationset-controller-5db688844c   0         0         0       3m20s
replicaset.apps/argo-cd-argocd-dex-server-5896478fbf                  1         1         1       2m27s
replicaset.apps/argo-cd-argocd-dex-server-cd48d7bc                    0         0         0       3m20s
replicaset.apps/argo-cd-argocd-notifications-controller-74fb7466f6    1         1         1       2m26s
replicaset.apps/argo-cd-argocd-notifications-controller-7d7ccc6b9d    0         0         0       3m20s
replicaset.apps/argo-cd-argocd-redis-69dd89b5bd                       1         1         1       2m27s
replicaset.apps/argo-cd-argocd-redis-7f89c69877                       0         0         0       3m20s
replicaset.apps/argo-cd-argocd-repo-server-74cd459bc9                 1         1         1       2m27s
replicaset.apps/argo-cd-argocd-repo-server-85f99fd4dd                 0         0         0       3m20s
replicaset.apps/argo-cd-argocd-server-6d9549674b                      1         1         1       2m27s
replicaset.apps/argo-cd-argocd-server-bc55fb96                        0         0         0       3m20s

NAME                                                     READY   AGE
statefulset.apps/argo-cd-argocd-application-controller   1/1     3m20s

NAME                                                             REFERENCE                               TARGETS           MINPODS   MAXPODS   REPLICAS   AGE
horizontalpodautoscaler.autoscaling/argo-cd-argocd-repo-server   Deployment/argo-cd-argocd-repo-server   13%/50%, 3%/50%   1         5         1          2m27s
horizontalpodautoscaler.autoscaling/argo-cd-argocd-server        Deployment/argo-cd-argocd-server        10%/50%, 2%/50%   1         5         1          2m27s

Argo CDにログインしてみます。以下のコマンドで、ログイン情報が確認できます。(Ingressで構成されていてALB経由でログインできます)

terraform output -raw access_argocd
echo "ArgoCD Username: admin"
echo "ArgoCD Password: $(kubectl --context hub get secrets argocd-initial-admin-secret -n argocd --template="{{index .data.password | base64decode}}")"
echo "ArgoCD URL: https://$(kubectl --context hub get svc -n argocd argo-cd-argocd-server -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')"
出力例

ArgoCD Username: admin

ArgoCD Password: <password>
ArgoCD URL: https://<ELBエンドポイント>

Applications_Tiles_-_Argo_CD

spoke用のAmazon EKSクラスターをデプロイ

spoke用(ワークロード)のAmazon EKSクラスターをデプロイします。

今回は1台だけ作成します。dev用のAmazon EKSクラスターを作成します。

cd ../spokes
./deploy.sh dev

deploy.shはterraform workspaceの切り替えやapplyをラップしたスクリプトです。

スクリプトの実行が完了すると、Amazon EKSクラスターが作成されていることを確認できます。

Argo CDを見てみると、作成したAmazon EKSクラスターspoke-devが登録されていることがわかります。

Clusters___Settings_-_Argo_CD-2

Applicationも登録されています。

Applications_Tiles_-_Argo_CD-2

これで環境の用意ができました。

後片付け

使い終わったら、リソースを削除します。

destroy.shを実行することで、terraform destroyが行われリソースが削除されます。

# spoke側の削除
./destroy.sh dev
# hub側の削除
cd ../hub
./destroy.sh

おわりに

Argo CD外部クラスターの登録周りの検証で、環境用意が必要なことがありました。

Blueprintsを使えばほぼTerraform実行だけで済むので、かなり時間短縮できました。

他にも色々便利なパターンがありそうなので、時間を見つけて見ていこうと思います。

以上、AWS事業本部の佐藤(@chari7311)でした。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.